闲话 22.12.9
闲话
我说我今天主要刷的是网络流题你信嘛(
主要是在上网课 然后老师讲课:“一说荒漠就会想到仙人掌”
就在群里发这题
浅看了一下发现不会 然后写了
是……辣个男人!他又来了(
有标号荒漠计数
我们定义一张图是荒漠,当且仅当其每个极大联通分量都是仙人掌。
给定 ,求有多少 个点的不同的荒漠。结果对 取模。。
首先要计数有标号荒漠,可以先计数有标号仙人掌。最后作 就能得到答案。
注意答案是无根的,但是仙人掌显然是有根好统计一些。因此我们记 为有标号有根仙人掌计数的生成函数。考虑将一系列根连成环接在指定的一个根上,并由环没有方向,有
无根考虑答案即为 。
由于 里面东西太多,我们考虑记
设 为答案计数的生成函数,有 。
到这一步的话自然想到 Lagrange 反演。设 ,有 。现在只需要把另一部分化成同一形式就行了。
自然导出了 。记 ,有
这样我们需要的所有拼图都齐全了。拉格朗日反演得到
于是可以分别讨论三个(两个?)部分如何做。
显然
下面需要 。根据 Wolfram|Alpha,
于是
观察 是个啥。其一是 ,其二是 。我们发现,假设 中是连乘形式,且其中有 项,将 带入后,只需要将后面的 消除即可。
不妨考虑 ,容易发现此函数满足需要。
因此我们能得到 。
因为上面还有一个 次方,该部分的贡献是 。
下面需要 。根据 Wolfram|Alpha,
于是
根据化简过程中不很简的部分,这玩意微分有限,存在线性递推,因此可以 地算。
具体地,我们首先考察 。求导后化简可以得到
过程 dirty,不细说了(
随后考察 。同理有
这自然导出了递推方案。答案即为
初值抄鰰的(
代码全屏好看(
code
#include <bits/stdc++.h>
using namespace std; using pii = pair<int,int>; using vi = vector<int>; using ll = long long;
using ull = unsigned long long; using db = double; using ld = long double; using lll = __int128_t;
mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
template <typename T> T rand(T l, T r) { return uniform_int_distribution<T>(l, r)(rnd); }
template <typename T1, typename T2> T1 min(T1 a, T2 b) { return a < b ? a : b; }
template <typename T1, typename T2> T1 max(T1 a, T2 b) { return a > b ? a : b; }
#define file(x) freopen(#x".in", "r", stdin), freopen(#x".out", "w", stdout)
#define ufile(x)
#define rep(i,s,t) for (register int i = (s), i##_ = (t) + 1; i < i##_; ++ i)
#define pre(i,s,t) for (register int i = (s), i##_ = (t) - 1; i > i##_; -- i)
#define Aster(i, s) for (int i = head[s], v; i; i = e[i].next)
#define all(s) s.begin(), s.end()
#define eb emplace_back
#define pb pop_back
#define em emplace
const int N = 1e5 + 10, mod = 998244353, ans[] = {1, 1, 2, 8, 57};
const int inf = 0x3f3f3f3f;
const ll infll = 0x3f3f3f3f3f3f3f3fll;
int n, inv[N], fac;
signed main() {
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
cin >> n;
if (n <= 4) cout << ans[n], exit(0);
inv[0] = inv[1] = fac = 1;
rep(i,2,n) inv[i] = 1ll * (mod - mod / i) * inv[mod % i] % mod, fac = 1ll * fac * i % mod;
vector<int> coef{ 0, 2 * n + 6, mod - (2 * n + 10), n + 4, mod - 1 },
g{ 1, n + 3, ((1ll * (n + 7) * n >> 1) + 5) % mod, ((1ll * (n + 12) * n % mod + 42) * n % mod + 38) * inv[6] % mod };
g.resize(n + 1);
rep(i,4,n) {
g[i] = (1ll * coef[1] * g[i - 1] % mod + 1ll * coef[2] * g[i - 2] % mod +
1ll * coef[3] * g[i - 3] % mod + 1ll * coef[4] * g[i - 4] % mod) * inv[2] % mod;
g[i] = (g[i] + 1ll * ((i - 1) << 1) * g[i - 1] % mod - 1ll * (i - 2) * g[i - 2] % mod + mod) % mod * inv[i] % mod;
}
fac = 1ll * fac * (g[n] - 3ll * g[n - 1] % mod + 2ll * g[n - 2] - 1ll * inv[2] * g[n - 3] % mod + 2 * mod) % mod;
cout << (fac + mod) % mod << endl;
}
upd:使用 ODE+ 自动机,可以让计算机帮我们在 复杂度内完成。Submission
code
signed main() {
int n; cin >> n;
ODE B(2);
B[0].redegree(3); B[1].redegree(2);
B[0][3] = 1, B[0][2] = mod - n - 4, B[0][1] = 2 * n + 10, B[0][0] = mod - 2 * n - 6;
B[1][2] = 2, B[1][1] = mod - 4, B[1][0] = 2;
poly f(4); f[3] = mod - ginv(2), f[2] = 2, f[1] = mod - 3, f[0] = 1;
ODE A = ode_power(1).composite(pfrac(topoly(f)));
A = A * B;
A.getPRec();
auto l = A.trans_poly();
int d = 0;
for (int i = 0; i < l.size(); ++ i) d = max(d, l[i].degree());
cout << 1ll * gfac(n) * p_recur(n, l.size() - 1, d, { 1, n,
int(1ll * "x^2 + x - 4"_p.eval(n) * ginv(2) % mod),
int(1ll * "x^3 + 3x^2 - 9x - 19"_p.eval(n) * ginv(6) % mod),
int(1ll * "x^4 + 6x^3 - 9x^2 - 88x - 87"_p.eval(n) * ginv(24) % mod),
int(1ll * "x^5 + 10x^4 + 5x^3 - 220x^2 - 685x - 452"_p.eval(n) * ginv(120) % mod),
int(1ll * "x^6 + 15x^5 + 45x^4 - 365x^3 - 2715x^2 - 5517x - 2600"_p.eval(n) * ginv(720) % mod)
}, l.data()) % mod << endl;
}
以下是博客签名,与正文无关。
请按如下方式引用此页:
本文作者 joke3579,原文链接:https://www.cnblogs.com/joke3579/p/chitchat221209.html。
遵循 CC BY-NC-SA 4.0 协议。
请读者尽量不要在评论区发布与博客内文完全无关的评论,视情况可能删除。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)